package pacoteScanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


public class Scanner{

    //singleton
    private static Scanner scanner;
    private boolean controleLinha=false;

    public static Scanner getScanner(){

        if(scanner == null){
            scanner = new Scanner();
        }
        return scanner;
    }

    private Scanner(){
        
    }

    private int caracterAtual, posicaoAtual, linhaAtual;
    private String texto = "";
    private char endOfString = 4;
   
    //obtem os caracteres
    public char nextChar(){
        if(controleLinha){//ajuste para só incrementar linha quando ler o primeiro caracter da linha seguinte
            setLinhaAtual(getLinhaAtual() + 1);
            controleLinha=false;
        }
        //incrementa linha quando tiver uma quebra
        if(getTexto().charAt(getCaracterAtual()) == '\n') {
            
            setPosicaoAtual(getCaracterAtual() + 1);
           controleLinha=true;

        }

        return getTexto().charAt(caracterAtual++);
    }

    //obtem os ASCII dos caracteres
    public int nextASCII(){
           return (int)nextChar();
    }

    public boolean isSpaceOrNewLine(char aChar) {

        return aChar == ' ' || aChar == '\t' || aChar == '\n';
    }

    public boolean isEndCaracter() {

        return getTexto().length() == getCaracterAtual();
    }

    //ver o proximo caractere mas nao incrementa caracterAtual
    public char getProximoChar() {

        return getTexto().charAt(getCaracterAtual());
    }

    public int getProximoASCII() {

        return (int)getTexto().charAt(getCaracterAtual());
    }

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {

        caracterAtual = 0;
        posicaoAtual = 0;
        linhaAtual = 1;
        

        String textoAuxiliar = texto + endOfString;

        this.texto = textoAuxiliar;
    }

    public int getCaracterAtual() {
        return caracterAtual;
    }

    public void setCaracterAtual(int caracterAtual) {
        this.caracterAtual = caracterAtual;
    }

    public int getPosicaoAtual() {
        return posicaoAtual;
    }

    public void setPosicaoAtual(int posicaoAtual) {
        this.posicaoAtual = posicaoAtual;
    }

    public int getLinhaAtual() {
        return linhaAtual;
    }

    public void setLinhaAtual(int linhaAtual) {
        this.linhaAtual = linhaAtual;
    }

    //teste dos metodos
//    public static void main(String[] args){
//
//        Scanner scanner = Scanner.getScanner();
//        String textoTeste = "Corinthias 100 anos de vida!!\t\n Corinthians 100 anos de NADA!!";
//        char linha = '\n';
//
////       char eos = 4;
////       System.out.printf("Caractere que representa o fim da string %c", eos);
////
////        String teste = textoTeste + eos;
////
//        scanner.setTexto(textoTeste);
//
//        System.out.println("Texto a checar " + (int) linha);
//        System.out.println("Tamanho do código: "+textoTeste.trim().length()+"\n----------------");
//        System.out.println("TEXTO: "+textoTeste);
//        System.out.println("|C|P|L| - |CARACTER(ASCII)|POSIÇÃO|LINHA|");
//
//        for(int i = 0; i <= textoTeste.length(); i++){
//
//
//            if(!scanner.isEndCaracter())
//
//
//                System.out.println("|"+scanner.nextASCII()+"|"+scanner.getCaracterAtual()+"|"+scanner.getLinhaAtual()+"|"/*|PROXIMO: "+scanner.getProximoChar()*/);
//
//if(scanner.getCaracterAtual() == '\n'){
//                   System.out.println("NOva linha");
//               }
//            //teste do ASCII
//                //System.out.println("|"+scanner.nextASCII()+"|"+scanner.getCaracterAtual()+"|"+scanner.getLinhaAtual()/*+"|PROXIMO: "+scanner.getProximoASCII()*/);
//
//        }
//
//        System.out.println("--------");
//        //System.out.println(scanner.next()+":"+scanner.getProximo());
//    }
}
